VERSION = $(shell test -d .git && git describe --tags --dirty 2>/dev/null)
ifeq "$(VERSION)" ""
VERSION = 28
endif

# paths
PREFIX ?= /usr/local
LIBDIR ?= /usr/lib

# includes and libs
PKGCONF_DEPS := freetype2 harfbuzz libopenjp2 libjpeg mupdf x11 zlib
CPPFLAGS += -D_GNU_SOURCE -DFFP
CFLAGS += -std=c99 -pedantic -Wall -Wextra -Wshadow $(shell pkg-config --cflags $(PKGCONF_DEPS))
LDLIBS = -L$(LIBDIR) -lpthread -ljbig2dec $(shell pkg-config --libs $(PKGCONF_DEPS))

# ocaml
CAMLOPT = ocamlopt
CAMLFLAGS = -g -w +a -safe-string -I +lablGL

VPATH = wsi/x11

C_SRC = cutils.c keysym2ucs.c link.c xlib.c version.c
C_OBJ = $(C_SRC:.c=.o)
OCAML_SRC = utils.ml wsi.ml confstruct.ml parser.ml config.ml ffi.ml glutils.ml help.ml keys.ml utf8syms.ml listview.ml main.ml
OCAML_OBJ = $(OCAML_SRC:.ml=.cmx)
MOD = unix.cmxa str.cmxa lablgl.cmxa
SRCMANS = $(wildcard adoc/*.adoc)
MANS = $(SRCMANS:.adoc=.1)

DISTFILES := Makefile $(OCAML_SRC) link.c glfont.c keysym2ucs.c wsi.mli
DISTFILES += $(wildcard *.sh) KEYS README BUILDING
DISTFILES += misc/ adoc/

all: llpp $(MANS)

# dependency ordering
config.cmx: wsi.cmi parser.cmx utils.cmx confstruct.cmx
confstruct.cmx: wsi.cmx utils.cmx
ffi.cmx: config.cmx
glutils.cmx: ffi.cmx
help.cmx: help.cmi config.cmx utils.cmx
listview.cmx: utils.cmx glutils.cmx config.cmx utf8syms.cmx
main.cmx: main.ml utils.cmx config.cmx glutils.cmx listview.cmx ffi.cmx keys.cmx wsi.cmx
main.cmx: CAMLFLAGS += -thread
parser.cmx: utils.cmx
wsi.cmi: utils.cmx keys.cmx
wsi.cmx: wsi.cmi

link.o: glfont.c
version.o: CPPFLAGS += -DLLPP_VERSION=$(VERSION)

# ordinary targets
llpp: $(OCAML_OBJ) $(C_OBJ)
	$(CAMLOPT) -o $@ $(CAMLFLAGS) $(C_OBJ) -ccopt '$(LDFLAGS)' -cclib '$(LDLIBS)' $(MOD) $(OCAML_OBJ)


confstruct.ml: genconfstr.sh
	sh $< >$@

# pattern rules
%.o: %.c
	$(CAMLOPT) -c -o $@ $(CAMLFLAGS) -cc $(CC) -ccopt '$(CFLAGS) $(CPPFLAGS)' $<

%.cmx: %.ml
	$(CAMLOPT) -c -o $@ $(CAMLFLAGS) $<

%.cmi: %.mli
	$(CAMLOPT) -c -o $@ $(CAMLFLAGS) $<

%.1: %.adoc adoc/asciidoc.conf
	a2x -d manpage -f manpage --asciidoc-opts="-f adoc/asciidoc.conf --out-file=$@.xml" $<

# special targets
clean:
	$(RM) llpp link.o help.ml $(OCAML_OBJ) $(OCAML_OBJ:.cmx=.cmi) $(OCAML_OBJ:.cmx=.o) $(MANS) $(MANS:.1=.xml)

dist: clean
	mkdir llpp-$(VERSION)
	cp -r $(DISTFILES) llpp-$(VERSION)
	tar czf llpp-$(VERSION).tar.gz llpp-$(VERSION)
	rm -rf llpp-$(VERSION)

install:
	install -Dm755 llpp "$(DESTDIR)"$(PREFIX)/bin/llpp
	install -Dm644 -t "$(DESTDIR)"$(PREFIX)/share/man/man1  $(MANS)
	install -Dm755 misc/llppac "$(DESTDIR)"$(PREFIX)/bin/llppac
	install -Dm755 misc/llpp.inotify "$(DESTDIR)"$(PREFIX)/bin/llpp.inotify
	install -Dm755 misc/llpphtml "$(DESTDIR)"$(PREFIX)/bin/llpphtml
	install -Dm644 misc/llpp.desktop "$(DESTDIR)"$(PREFIX)/share/applications/llpp.desktop

.PHONY: all clean dist install
